class TcpServer {
    public:
        TcpServer(EventLoop *loop, int port):
            _port(port), 
            _next_id(1),
            _base_loop(loop),
            _acceptor(new Acceptor(loop, port)), 
            _thread_pool(new EventLoopThreadPool(loop)),
            _connected_callback(connected_default_callback),
            _on_message_callback(onmessage_default_callback){
            /*给监听套接字对应Connection对象设置获取新连接成功后的处理函数，主要是给新连接申请Connection对象， 设置各项参数*/
            _acceptor->set_new_conn_callback(std::bind(&TcpServer::new_connection, this, std::placeholders::_1));
        }
        void set_connected_callback(const ConnectionComplateCallback &cb) { _connected_callback = cb; }
        void set_message_callback(const ConnectionMsgCallback &cb) { _on_message_callback = cb; }
        /*设置线程数量，默认0个IO线程--也就是将监听与IO放在一起*/
        void set_thread_count(int nums) {
            assert(nums >= 0);
            _thread_pool->ser_thread_count(nums);
        }
        /*启动eventloop线程池，并且压入第一个需要处理的函数---将监听套接字添加到Poller事件监控*/
        void start() {
            _thread_pool->start();
        }
    private:
        /*获取新连接成功后的回调--主要是申请Connection对象，设置关闭处理函数，然后将连接建立完成函数压入eventloop处理队列中*/
        void new_connection(int sockfd) {
            EventLoop *ioloop = _thread_pool->next_loop();
            ConnectionPtr conn(new Connection(ioloop, sockfd, _next_id));
            conn->set_connected_callback(_connected_callback);
            conn->set_on_message_callback(_on_message_callback);
            conn->set_close_callback(std::bind(&TcpServer::remove_connection, this, std::placeholders::_1));
            /*这里可以理解就是调用conn_established函数，不过不是当前调用，而是压入到eventloop的任务队列中，在io线程中调用，进行连接建立完毕后的下一步操作*/
            ioloop->run_in_loop(std::bind(&Connection::conn_established, conn));
            _connections[_next_id++] = conn;
        }
        void remove_connection(const ConnectionPtr &conn) {
            EventLoop *ioloop = conn->get_loop();
            ioloop->run_in_loop(std::bind(&TcpServer::remove_connection_in_loop, this, conn));
        }
        /*这个函数是被压入eventloop线程在eventloop中被调用的， 其实就是要关闭一个连接前的各种资源销毁处理，这一步的销毁主要是删除当前TcpServer中保存的信息*/
        void remove_connection_in_loop(const ConnectionPtr &conn) {
            /*释放conn保存在tcp_server中的shared_ptr,这样等最终外界所有的shared_ptr处理完销毁后续事项后被销毁，计数为0，则conn被释放*/
            _connections.erase(conn->id());
            LOG("delete conn from tcpserver:%p", conn.get());
            /*当前的处理完毕后，向处理队列中压入连接销毁的处理函数,其实本身就是在eventloop线程中调用，因此conn_destroyed是直接被执行的*/
            EventLoop *ioloop = conn->get_loop();
            ioloop->run_in_loop(std::bind(&Connection::conn_destroyed, conn));
        }
    private:
        /*这两个成员，是每次建立连接，Connection初始化后，设置的连接建立完成回调，和消息处理回调函数*/
        /*同时，这两个函数是自己可以编写默认的处理函数，或者由外界具体协议服务来设定*/
        ConnectionComplateCallback _connected_callback;
        ConnectionMsgCallback _on_message_callback;
    private:
        int _port;
        uint64_t _next_id;
        EventLoop *_base_loop;
        Acceptor *_acceptor;
        EventLoopThreadPool *_thread_pool;
        std::unordered_map<uint64_t, ConnectionPtr> _connections;
};